package czk.concrent.threadpool.forkandjoin;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

/**
 * ForkJoin的应用
 * 任务拆分解释
 * 适用于cpu密集型运算
 * @Author:ChenZhangKun
 * @Date: 2020/7/9 22:44
 */
public class ForkTest {
    public static void main(String[] args) {
        ForkJoinPool forkJoinPool=new ForkJoinPool();
        Integer invoke = forkJoinPool.invoke(new Task(5));
        System.out.println(invoke);
    }
}
// 创建任务
class Task extends RecursiveTask<Integer>{
    private int n;

    public Task(int n) {
        this.n = n;
    }

    @Override
    protected Integer compute() {
        System.out.println(Thread.currentThread().getName()+"操作"+this.n);
        // 终止条件
        if (n==1){
            return 1;
        }
        // 拆分任务
        Task task=new Task(n-1);
        // 让一个新线程去执行任务
        task.fork();
        // 拿到结果
        int result=n+task.join();
        return result;
    }
}
